package smallfrench.moteur.noeuds;

import smallfrench.moteur.biblio.RRien;
import smallfrench.moteur.interp.Portee;
import smallfrench.moteur.interp.RObjet;
import smallfrench.moteur.lexer.lexemes.Lexeme;

/**
 * Une déclaration de variable avec le mot-clé "var".
 * @author antoine1023
 *
 */
public class NDeclaration extends Noeud {

	private final String nom;

	/**
	 * Le noeud de droite ou <code>null</code>
	 */
	private final Noeud noeudDroite;

	public NDeclaration(Lexeme t, String nom, Noeud noeudDroite) {
		super(t);
		this.nom = nom;
		this.noeudDroite = noeudDroite;


		if (noeudDroite instanceof NBlocFonction) {
			// On nomme la fonction. Bon, ce n'est pas très joli.
			NBlocFonction fonction = (NBlocFonction) noeudDroite;
			fonction.setNom(nom);
		}
	}

	public NDeclaration(Lexeme t, String nom) {
		super(t);
		this.nom = nom;
		noeudDroite = null;
	}

	@Override
	public RObjet evaluer(Portee portee) {

		// On ajoute la variable à la pile.
		portee.ajouterVariable(nom, null);
		if (noeudDroite != null) {
			portee.ajouterVariable(nom, noeudDroite.evaluer(portee));
		}

		return RRien.RIEN;
	}

	@Override
	public String toString() {
		return "var " + nom;
	}
}
